#include <sys/select.h>
#include <sys/time.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <stdarg.h>
#include <unistd.h>
#include "response.h"

// #define FD_SETSIZE  _FD_SETSIZE

// 客户池
typedef struct{
    fd_set all_set;             // 全部
    fd_set read_fds;            // 准备要读的
    int max_fd;                 // 最大值
    int ready_num;              // 已经准备的个数
    int max_idx;                // 在数组中可获得的最大下标
    int client_fds[FD_SETSIZE]; // 客户数组
}client_pool;

// 初始化客户池
void init_pool(int listen_fd, client_pool *pool);

// 将准备好的客户端加入 all_set 和 client_fds 中，对应修改 max_fd 和 max_idx
void add_client_to_pool(int new_fd, client_pool *pool);

// 遍历client_fds 按顺序处理客户端(接收数据并调用process_pipelined_request)
// 每处理完一个客户端 调用 clear_client
void handle_clients(client_pool *pool);

// 关闭socket 将client_fd从all_set中删除 并将client_fds对应位置设为-1
void clear_client(int client_fd, int idx, client_pool *pool);

void set_fl(int fd, int flags);
void clr_fl(int fd, int flags);
void err_sys(const char *fmt, ...);